﻿
/*
Description:
Implement atoi which converts a string to an integer.

Example 1:

Input: "42"
Output: 42

Example 2:

Input: "   -42"
Output: -42
Explanation: The first non-whitespace character is '-', which is the minus sign.
Then take as many numerical digits as possible, which gets 42.

Example 3:

Input: "4193 with words"
Output: 4193
Explanation: Conversion stops at digit '3' as the next character is not a numerical digit.

Example 4:

Input: "words and 987"
Output: 0
Explanation: The first non-whitespace character is 'w', which is not a numerical
digit or a +/- sign. Therefore no valid conversion could be performed.

Example 5:

Input: "-91283472332"
Output: -2147483648
Explanation: The number "-91283472332" is out of the range of a 32-bit signed integer.
Thefore INT_MIN (−231) is returned.
*/

#include <iostream>
#include <string>
using namespace std;

class Solution {
public:
	//pure c
	int myAtoi(const char *str) {
		int sign = 1, base = 0, i = 0;
		while (str[i] == ' ') { i++; }
		if (str[i] == '-' || str[i] == '+') {
			sign = 1 - 2 * (str[i++] == '-');
		}
		while (str[i] >= '0' && str[i] <= '9') {
			if (base >  INT_MAX / 10 || (base == INT_MAX / 10 && str[i] - '0' > 7)) {
				if (sign == 1) return INT_MAX;
				else return INT_MIN;
			}
			base = 10 * base + (str[i++] - '0');
		}
		return base * sign;
	}

	//c++ using stl
	int myAtoi(string str) {
		long long int result = 0;
		int indicator = 1;

		int i = str.find_first_not_of(' ');
		if (str[i] == '-' || str[i] == '+')
			indicator = (str[i++] == '-') ? -1 : 1;

		while ('0' <= str[i] && str[i] <= '9')
		{
			result = result * 10 + (str[i++] - '0');
			if (result*indicator >= INT_MAX) return INT_MAX;
			if (result*indicator <= INT_MIN) return INT_MIN;
		}

		return result * indicator;
	}
};

int _myAtoi()
{
	string s = "   -42";
	int num=0;
	Solution solu;	

	num = solu.myAtoi(s);

	cout << "raw str: " << s << endl;
	cout << "num: " << num << endl;
	return 0;
}